<?php
namespace App\Config;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

 class JwtConfig{
    // 密钥（生产环境建议使用环境变量）
    const SECRET_KEY = 'gsdrgsdrgedsrgdzgsggfawretgergdrgdfgvfdghnfyjhyhgdsgdfg';
    // 访问Token有效期（1800秒=30分钟）
    const ACCESS_TOKEN_EXPIRES_IN = 1800;
    // 刷新Token有效期（7天）
    const REFRESH_TOKEN_EXPIRES_IN = 604800;
    // 算法
    const ALGORITHM = 'HS256';

    /**
     * 生成访问Token
     * @param array $userData 用户数据
     * @return string JWT Token
     */
    public static function generateAccessToken($userData) {
        $issuedAt = time();
        $expire = $issuedAt + self::ACCESS_TOKEN_EXPIRES_IN;

        $payload = [
            'iat' => $issuedAt,           // 签发时间
            'exp' => $expire,             // 过期时间
            'data' => $userData,          // 用户数据
            'type' => 'access',           // Token类型
            'jti' => bin2hex(random_bytes(16)) // 唯一标识符
        ];

        return JWT::encode($payload, self::SECRET_KEY, self::ALGORITHM);
    }

    /**
     * 生成刷新Token
     * @param array $userData 用户数据
     * @return string JWT Token
     */
    public static function generateRefreshToken($userData) {
        $issuedAt = time();
        $expire = $issuedAt + self::REFRESH_TOKEN_EXPIRES_IN;

        $payload = [
            'iat' => $issuedAt,           // 签发时间
            'exp' => $expire,             // 过期时间
            'data' => $userData,          // 用户数据
            'type' => 'refresh',          // Token类型
            'jti' => bin2hex(random_bytes(16)) // 唯一标识符
        ];

        return JWT::encode($payload, self::SECRET_KEY, self::ALGORITHM);
    }

    /**
     * 验证并解析JWT Token
     * @param string $token JWT Token
     * @return object 解码后的数据
     * @throws \Exception 当token无效或过期时抛出异常
     */
    public static function validateToken($token) {
        try {
            return JWT::decode($token, new Key(self::SECRET_KEY, self::ALGORITHM));
        } catch (\Exception $e) {
            throw new \Exception('Token无效: ' . $e->getMessage());
        }
    }

    /**
     * 从Token中获取用户ID
     * @param string $token JWT Token
     * @return int|null 用户ID，如果token无效则返回null
     */
    public static function getUserIdFromToken($token) {
        try {
            $decoded = self::validateToken($token);
            if (self::isAccessToken($decoded)) {
                return $decoded->data->id;
            }
            return null;
        } catch (\Exception $e) {
            return null;
            // throw new \Exception('Token无效: ' . $e->getMessage());
        }
        return null;
    }

    /**
     * 验证Token是否为访问Token
     * @param object $decoded 解码后的Token
     * @return bool
     */
    public static function isAccessToken($decoded) {
        return isset($decoded->type) && $decoded->type === 'access';
    }
    
    /**
     * 验证Token是否为刷新Token
     * @param object $decoded 解码后的Token
     * @return bool
     */
    public static function isRefreshToken($decoded) {
        return isset($decoded->type) && $decoded->type === 'refresh';
    }
    
    /**
     * 验证Token是否已过期
     * @param object $decoded 解码后的Token
     * @return bool
     */
    public static function isTokenExpired($decoded) {
        return time() > $decoded->exp;
    }


 }
?> 